package com.aaa.gs.service.impl;

import com.aaa.common.entity.ProductType;
import com.aaa.common.entity.Store;
import com.aaa.common.entity.User;
import com.aaa.common.util.TokenUtil;
import com.aaa.common.vo.ProductTypeVO;
import com.aaa.gs.dao.ProductTypeDao;
import com.aaa.gs.service.ProductTypeService;
import com.aaa.gs.service.RemoteUserService;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Service;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.aaa.common.util.CustomException;
import com.aaa.common.util.ResultStatus;
import com.aaa.common.vo.Page;


import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * (ProductType)表服务实现类
 *
 * @author makejava
 * @since 2025-09-16 09:18:38
 */
@Service("productTypeService")
@Log4j2
public class ProductTypeServiceImpl implements ProductTypeService {
    @Resource
    private ProductTypeDao productTypeDao;
    @Resource
    private HttpServletRequest request;
    //远程调用
    @Resource
    private RemoteUserService remoteUserService;

    /**
     * 通过ID查询单条数据
     *
     * @param commentId 主键
     * @return 实例对象
     */
    @Override
    public ProductTypeVO queryById(Integer commentId) {
        return this.productTypeDao.queryById(commentId);
    }

    /**
     * 分页查询
     *
     * @param page 筛选条件
     * @return 查询结果
     */
    @Override
    public PageInfo queryByPage(Page<ProductTypeVO> page) {
        //分页操作  分页参数一定要进行传递
        if (page == null || page.getPageNo() == null || page.getPageNo() == 0 || page.getPageSize() == null || page.getPageSize() == 0) {
            //进行业务编写时，可以抛出自定义异常
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMessage());
        }
        //开启分页
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //获取查询对象
        ProductTypeVO productType = page.getData();
        //获取商品类型列表
        List<ProductTypeVO> productTypeList = productTypeDao.queryAllByLimit(productType);
        //循环遍历商品列表
        for (ProductTypeVO type : productTypeList) {
            //设置创建人信息
            //Objects.nonNull() 使用Objects里的nonNull方法判断对象是否为空
            /*if (Objects.nonNull(type.getCreateBy())){
                //User user = remoteUserService.queryById(type.getCreateBy());
                type.setUserA(remoteUserService.queryById(type.getCreateBy()));
            }else {
                type.setUserA(new User());
            }*/
            // 修改后（添加异常捕获）
            if (Objects.nonNull(type.getCreateBy())){
                try {
                    User createUser = remoteUserService.queryById(type.getCreateBy());
                    type.setUserA(createUser);
                } catch (Exception e) {
                    log.error("查询创建人信息失败，用户ID：{}", type.getCreateBy(), e);
                    type.setUserA(new User()); // 异常时设置默认空用户
                }
            }else {
                type.setUserA(new User());
            }
            //设置更新人信息
            /*if (Objects.nonNull(type.getUpdateBy())){
                type.setUserB(remoteUserService.queryById(type.getUpdateBy()));
            }else {
                type.setUserB(new User());
            }*/
            // 修改后（添加异常捕获）
            if (Objects.nonNull(type.getUpdateBy())){
                try {
                    User updateUser = remoteUserService.queryById(type.getUpdateBy());
                    type.setUserA(updateUser);
                } catch (Exception e) {
                    log.error("查询创建人信息失败，用户ID：{}", type.getUpdateBy(), e);
                    type.setUserB(new User()); // 异常时设置默认空用户
                }
            }else {
                type.setUserB(new User());
            }
        }
        //return new PageInfo(productTypeDao.queryAllByLimit(productType));
        return new PageInfo(productTypeList);
    }

    @Override
    public PageInfo queryByPage1(Page<ProductTypeVO> page) {
        //分页操作  分页参数一定要进行传递
        if (page == null || page.getPageNo() == null || page.getPageNo() == 0 || page.getPageSize() == null || page.getPageSize() == 0) {
            //进行业务编写时，可以抛出自定义异常
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMessage());
        }
        //开启分页
        PageHelper.startPage(page.getPageNo(), page.getPageSize());
        //获取查询对象
        ProductTypeVO productType = page.getData();
        return new PageInfo(productTypeDao.queryAllByLimit(productType));
    }

    /**
     * 新增数据
     *
     * @param productType 实例对象
     * @return 实例对象
     */
    @Override
    public ProductType insert(ProductType productType) {
        String userId = TokenUtil.getUserId(request);
        //判断更新人是否为空
        if (userId == null || userId.trim().isEmpty()) {
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMessage());
        }
        // 设置创建人
        productType.setCreateBy(Integer.parseInt(userId));
        // 补充创建时间
        productType.setCreateTime(new Date());
        this.productTypeDao.insert(productType);
        return productType;
    }

    /**
     * 修改数据
     *
     * @param productType 实例对象
     * @return 实例对象
     */
    @Override
    public ProductTypeVO update(ProductTypeVO productType) {
        //设置更新人
        String userId = TokenUtil.getUserId(request);
        //判断更新人是否为空
        if (userId == null || userId.trim().isEmpty()) {
            throw new CustomException(ResultStatus.PARAM_NOT_EMPTY.getReturnCode(),
                    ResultStatus.PARAM_NOT_EMPTY.getReturnMessage());
        }
        //设置更新人和更新时间
        productType.setUpdateBy(Integer.parseInt(userId));
        productType.setUpdateTime(new Date());
        //更新数据
        this.productTypeDao.update(productType);
        //返回更新后的最新数据
        return this.queryById(productType.getCommentId());
    }

    /**
     * 通过主键删除数据
     *
     * @param commentId 主键
     * @return 是否成功
     */
    @Override
    public boolean deleteById(Integer commentId) {
        return this.productTypeDao.deleteById(commentId) > 0;
    }
}
